package sgbag1.Vues;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;

import java.awt.Rectangle;

import java.util.ArrayList;
import java.util.List;

import sgbag1.Noyau.Aeroport;

public class VueAeroport extends Vue {
    /**
     * @associates <{sgbag1.Vues.VueElement}>
     */
    private List<VueElement> listElements;

    /**
     * @associates <{sgbag1.Vues.VueChariot}>
     */
    private List<VueChariot> listChariots;
    
    private double longueurAeroport;
    private double largeurAeroport;
    private double largeurFenetre = 0;
    private double hauteurFenetre = 0;
    private Aeroport aeroport;
    
    public VueAeroport(Aeroport a){
        this(a.getLongeur(), a.getLargeur());
        aeroport = a;
        
    }

    public VueAeroport(int longueurAeroport, int largeurAeroport){
       this.longueurAeroport = longueurAeroport;
       this.largeurAeroport = largeurAeroport;
       listElements = new ArrayList<VueElement>();
       listChariots = new ArrayList<VueChariot>();
    }
    
    public void setTailleFenetre(double largeurFenetre, double hauteurFenetre){
        if(this.largeurFenetre != largeurFenetre || this.hauteurFenetre != hauteurFenetre){
            this.largeurFenetre = largeurFenetre;
            this.hauteurFenetre = hauteurFenetre;
            
            tauxConversion = Math.min(largeurFenetre/aeroport.getLargeur(), hauteurFenetre/aeroport.getLongeur());
            System.out.println("taux conversion : " + tauxConversion);
            this.longueurAeroport = (aeroport.getLongeur() * tauxConversion);
            this.largeurAeroport = (aeroport.getLargeur() * tauxConversion);
            System.out.println("longueur aeroport: " + this.longueurAeroport);
            System.out.println("largeur aeroport: " + this.largeurAeroport);
            
            if(aeroport.getLargeur()/largeurFenetre > aeroport.getLongeur()/hauteurFenetre){
                position = new Point(0, (int)(hauteurFenetre - longueurAeroport ) / 2);
            }
            else{
                position = new Point((int)(largeurFenetre - largeurAeroport) / 2, 0);
            }
            
            System.out.println(position);
            for(Vue v : listElements ){
                v.setTauxConversion(tauxConversion);
                v.setDecalage(position);
            }
            
            for(VueChariot v : listChariots){
                v.setTauxConversion(tauxConversion);
                v.setDecalage(position);
            }
            
        }
        CalculerBoiteEnglobante();
    }

    public void ajouteElement(Vue element){
        if(element.getClass() == Vue.class || 
           element.getClass() == VueAeroport.class || 
           element.getClass() == VueElement.class || 
           element == null){
            return;//l'element passe en parametre est de type Vue, VueAeroport ou VueElement
        }
        
        if(element.getClass() == VueChariot.class){
            listChariots.add((VueChariot)element);
        }
        else{
            listElements.add((VueElement)element);
        }
    }
    
    @Override
    public void Dessiner(Graphics g){
        Color tempc = g.getColor();
        g.setColor(new Color(255, 255, 255));

        //g.fillRect(((Rectangle)boiteEnglobante).x, ((Rectangle)boiteEnglobante).y, (int)((Rectangle)boiteEnglobante).getWidth(), (int)((Rectangle)boiteEnglobante).getHeight());
        Graphics2D g2 = (Graphics2D)g;
        g2.fill(boiteEnglobante);

        g.setColor(tempc);
        
        for(Vue v : listElements ){
            v.Dessiner(g);
        }
        
        for(VueChariot v : listChariots){
            v.Dessiner(g);
        }
    }
    
    @Override
    public void CalculerBoiteEnglobante() {
        boiteEnglobante = new Rectangle((int)position.getX(), (int)position.getY(), (int)this.largeurAeroport, (int)this.longueurAeroport);
    }
    
    public void deselectionnerObjets(){
        for(VueChariot c : listChariots){
            c.ChangerEtat(EtatElement.NORMAL);
        }
        for(VueElement v : listElements){
            v.ChangerEtat(EtatElement.NORMAL);
        }
    }
    
    public Object getElementClique(int x, int y){
        //deselection des objets precedements cliques
        deselectionnerObjets();
        
        if(!this.IsClicked(x, y)){
            return null;
        }
        
        for(VueChariot c : listChariots){
            if(c.IsClicked(x, y)){
                c.ChangerEtat(EtatElement.SELECTED);
                return c.getObjetNoyau();
            }
        }
        
        for(VueElement v : listElements){
            if(v.IsClicked(x, y)){
                v.ChangerEtat(EtatElement.SELECTED);
                if(v.getClass() == VueRail.class){
                    return ((VueRail)v).getObjetNoyau();
                }
                if(v.getClass() == VueGuichet.class){
                    return ((VueGuichet)v).getObjetNoyau();
                }
                if(v.getClass() == VueTapis.class){
                    return ((VueTapis)v).getObjetNoyau();
                }
                if(v.getClass() == VueToboggan.class){
                    return ((VueToboggan)v).getObjetNoyau();
                }
            }
        }
        
        return null;
    }
}
